perm filename ARRAY.LSP[SCH,LSP] blob sn#688822 filedate 1982-11-14 generic text, type T, neo UTF8
;;; -*-LISP-*-  ARRAY OBJECTS

(HERALD ARRAY "")

(eval-when (compile) (load "scm:umacro"))
(eval-when (compile) (load "scm:smacro"))

(DEFMACRO ARRAY? (OBJECT)
  `(AND (HUNKP ,OBJECT) (EQ (OBJECT-TYPE ,OBJECT) '*ARRAY*)))

(DEFMACRO ARRAY-PTR (ARRAY)
  `(CXR 0 ,ARRAY))

(DEFMACRO ARRAY-DIMENSIONS (ARRAY)
  `(CXR 2 ,ARRAY))

(DEFUN MAKE-ARRAY-PTR (DIMENSIONS)
  (APPLY #'*ARRAY `(NIL T ,@DIMENSIONS)))

(DEFUN ARRAY-FETCH (PTR SUBSCRIPTS)
  (APPLY #'ARRAYCALL `(T ,PTR ,@SUBSCRIPTS)))

(DEFUN ARRAY-STORE (PTR SUBSCRIPTS VALUE)
  (STORE (APPLY #'ARRAYCALL `(T ,PTR ,@SUBSCRIPTS)) VALUE))

(DEFUN-IMPORT MAKE-ARRAY-OBJECT (DIMENSIONS INIT-PROC)
  (HUNK '*ARRAY*
	DIMENSIONS
	INIT-PROC
	(MAKE-ARRAY-PTR DIMENSIONS)))

(DEFUN-IMPORT (ACCESS-ARRAY SCHAREF) (ARRAY COORDINATES)
  (OR (ARRAY? ARRAY)
      (SCH-ERROR "Non-Array -- AREF" ARRAY))
  (ARRAY-FETCH (ARRAY-PTR ARRAY) COORDINATES))

(DEFUN-IMPORT (SET!-ARRAY SCHASET BUT-1-FORCED-SUBR) (ARRAY COORDINATES VALUE)
  (COND ((ARRAY? ARRAY)
	 (ARRAY-STORE (ARRAY-PTR ARRAY) COORDINATES VALUE))
	(T
	 (SCH-ERROR "Non-Array -- ASET" ARRAY))))

(DEFUN-IMPORT (DIMENSIONS-ARRAY SCHARRAYDIMS) (OBJECT)
       (OR (ARRAY? OBJECT)
	   (SCH-ERROR "Non-Array -- ARRAYDIMS" OBJECT))
       (ARRAY-DIMENSIONS OBJECT))

(DEFUN-IMPORT (ARRAY? SCHARRAY?) (OBJECT)
  (ARRAY? OBJECT))

;;; Property Lists

(DEFUN SCH-PLIST-1 (KNOWN-SYM)
  (CDR (GET KNOWN-SYM 'SCH-PROPERTY-LIST)))

(DEFUN-IMPORT LIST-PROP (SYM)
  (COND ((SYMBOLP SYM)
	 (ASSOCIATE (SCH-PLIST-1 SYM)))
	(T
	 (SCH-ERROR "Non-Symbolic Property Holder -- PLIST" (LIST 'PLIST SYM)))))

(DEFUN-IMPORT REMOVE!-PROP (SYM SLOT)
  (COND ((SYMBOLP SYM)
	 (LET ((OLD-VAL (GET-PROP SYM SLOT)))
	   (REMPROP (GET SYM 'SCH-PROPERTY-LIST) SLOT)
	   OLD-VAL))
	(T
	 (SCH-ERROR "Non-Symbolic Property Holder -- REMOVE!-PROP"
		(LIST 'REMOVE!-PROP SYM SLOT)))))

(DEFUN-IMPORT (PUT!-PROP PUT!-PROP BUT-1-FORCED-SUBR) (SYM SLOT VAL)
  (COND ((SYMBOLP SYM)
	 (LET ((PROPERTY-LIST (GET SYM 'SCH-PROPERTY-LIST)))
	   (COND (PROPERTY-LIST
		  (PUTPROP PROPERTY-LIST VAL SLOT))
		 (T
		  (PUTPROP SYM (LIST () SLOT VAL) 'SCH-PROPERTY-LIST)))
	   VAL))
	(T
	 (SCH-ERROR "Non-Symbolic Property Holder -- PUT!-PROP"
		(LIST 'PUT!-PROP SYM SLOT VAL)))))

(DEFUN-IMPORT GET-PROP (SYM SLOT)
  (COND ((SYMBOLP SYM)
	 (DO ((L (SCH-PLIST-1 SYM) (CDDR L)))
	     ((NULL L) ())
	   (IF (EQ SLOT (CAR L))
	       (RETURN (CADR L)))))
	(T
	 (SCH-ERROR "Non-Symbolic Property Holder -- GET-PROP"
		(LIST 'GET-PROP SYM SLOT)))))

;;;; Compound names.

;;; (value-compound-name <env> <name>) ===> <value>		;lexical lookup
;;; (assign!-compound-name <env> <name> <value>)		;lexical assign
;;; (define!-compound-name <env> <name> <value>)		;local define


(defun-import value-compound-name (env name)
  (relative-lexical-access env (canonicalize-compound-name name)))

(defun-import (assign!-compound-name assign!-compound-name but-1-forced-subr)
  (env name value)
  (relative-lexical-assign env (canonicalize-compound-name name) value))

(defun-import (define!-compound-name define!-compound-name but-1-forced-subr)
  (env name value)
  (local-define! env (canonicalize-compound-name name) value))


(defvar canonicalization-tree (list '*compound-name-tree* nil))

(defun-import canonicalize-compound-name (name)
  (let ((place (walk-discrimination-tree name canonicalization-tree)))
    (if (null (cadr place))
	(let ((newname (make-new-canonical-name name)))
	  (rplaca (cdr place) newname)
	  newname))
    (cadr place)))

(defun walk-discrimination-tree (name tree)
  (if (null name)
      tree
      (walk-discrimination-tree (cdr name)
				(find-subtree (car name) tree))))

(defun find-subtree (component tree)
  (let ((subtree (assq component (cddr tree))))
	(if (null subtree)
	    (progn (setq subtree (list component nil))
		   (rplacd (cdr tree)
			   (cons subtree (cddr tree)))))
	subtree))

(defun make-new-canonical-name (l)
  (list l))